package com.itheima.genericity_demo.wildcard_demo;

import java.util.ArrayList;
import java.util.List;

/*
    泛型通配符搭配集合使用一般在方法的参数中比较常见
    方法中的参数是一个集合,集合如果携带了通配符，要特别注意如下：
    1  集合的类型会提升为Object类型。
    2  方法中的参数是一个集合,集合如果携带了通配符,那么此集合不能进行添加和修改操作 , 可以删除和获取
       在集合中泛型是不支持多态的，如果为了匹配任意类型，我们就会使用泛型通配符了。如下案例

    已知存在继承体系：Integer继承Number，Number继承Object。定义一个方法，方法的参数是一个ArrayList。
    要求可以接收ArrayList<Integer>,ArrayList<Number>,ArrayList<Object>,ArrayList<String>这些类型的数据
 */
public class Test1 {
    public static void main(String[] args) {
        List<Object> list1 = new ArrayList<>();
        List<Number> list2 = new ArrayList<>();
        List<Integer> list3 = new ArrayList<>();
        List<String> list4 = new ArrayList<>();


        show1(list1);
//        show1(list2);
//        show1(list3);
//        show1(list4);

        show2(list2);
//        show2(list3);

        show(list1);
        show(list2);
        show(list3);
        show(list4);
    }

    // show1方法参数是存储Object数据的集合 , 那么此集合只能接收存储Object类型数据的集合 , 集合的泛型不存在多态
    public static void show1(List<Object> list){

    }
    // show2方法参数是存储Number数据的集合 , 那么此集合只能接收存储Number类型数据的集合 , 集合的泛型不存在多态
    public static void show2(List<Number> list){

    }
    // show3方法参数是存储Integer数据的集合 , 那么此集合只能接收存储Integer类型数据的集合 , 集合的泛型不存在多态
    public static void show3(List<Integer> list){

    }
    // show4方法参数是存储String数据的集合 , 那么此集合只能接收存储String类型数据的集合 , 集合的泛型不存在多态
    public static void show4(List<String> list){

    }

    public static void show(List<?> list){
        // 1 集合的类型会提升为Object类型。
        // Object o = list.get(0);

        // 2方法中的参数是一个集合,集合如果携带了通配符,那么此集合不能进行添加和修改操作 , 可以删除和获取
        // list.add("abc");
        // list.add(123);
        // list.add(new Object());

        // 可以删除和获取
        list.remove(1);
        Object o = list.get(0);
    }

    public static <E> void method(List<E> list){}


}
